package binaryTree;

import java.util.ArrayList;
import java.util.List;

public class Class501 {

    TreeNode pre;
    int[] res;
    List list;
    int Maxcount;
    int count;
    public int[] findMode(TreeNode root) {
        pre=new TreeNode(0);
        list=new ArrayList();
        Maxcount=0;
        count=0;
        if (root==null){
            return  null;
        }
        traverse(root);
        res=new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i]= (int) list.get(i);
        }
        return  res;
    }

    public  void traverse(TreeNode  root){
        if (root==null){
            return;
        }
        traverse(root.left);
//        if (pre==null){
//            count=1;
//            pre=root;
//            list.add(root.val);
//        }
//        else{
//            if (root.val==pre.val){
//                count++;
//            }
//            else{
//                list.add(root.val);
//                count=1;
//            }
//        }
//        if (count>=Maxcount){
//            Maxcount=count;
//        }
//        pre=root;
//        traverse(root.right);
//todo:这个逻辑我就是写不出来　　这大概就是编码能力的差别吧　　
// 看看下面这个写的很清晰易懂 把问题想清楚啦　　写起来就没那么难了

        // 计数
        if (pre == null || root.val != pre.val) {
            count = 1;
        } else {
            count++;
        }
        // 更新结果以及maxCount
        if (count > Maxcount) {
           list.clear();
            list.add(root.val);
            Maxcount = count;
        }
        //如果此处不加上else 那么执行完上一个ｉｆ语句之后　　Maxcount将一直等于count 又会将重复的元素再添加一遍
        else if (count == Maxcount) {
            list.add(root.val);
        }
        pre = root;
        traverse(root.right);
    }

    public static void main(String[] args) {
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(2);
        treeNode1.right=treeNode2;
        treeNode2.left=treeNode3;
        Class501 class501 = new Class501();
        int[] mode = class501.findMode(treeNode1);
        for (int a:mode
             ) {
            System.out.println(a);

        }

    }
}
